/**
 * @overview 这是一个抽象基类，所以组件都要继承此类，此类定义了组件的配置能力和事件属性。
 * 此外还定义了一些非常基本的属性(字体，边框，阴影)。
 * @component#iChart.Element
 * @extend#Object
 */
iChart.Element = function(config) {
	/**
	 * indicate the element's type
	 */
	this.type = 'element';

	/**
	 * define abstract method
	 */
	iChart.DefineAbstract('configure', this);
	iChart.DefineAbstract('afterConfiguration', this);

	/**
	 * All of the configuration will in this property
	 */
	this.options = {};

	this.set({
		/**
		 * @inner {String} The unique id of this element (defaults to an auto-assigned id).
		 */
		id : '',
		/**
		 * @cfg {Object} 此组件中边框的属性样式。
		 * 此属性是一个对象，可用的属性如下：
		 * @Option enable {boolean} 是否边框可用。(默认为false)
		 * @Option color {String} 边框的颜色。(默认为'#BCBCBC')
		 * @Option width {Number/String} 边框的宽度,单位px。如果为字符串，其宽度值解析方式与css的padding一致。且radius将会设置为0。(默认为1)
		 * @Option radius {Number/String} 边框的圆角值.如果给出字符串，解析方式与css的padding一致。(默认为0)
		 */
		border : {
			enable : false,
			color : '#BCBCBC',
			style : 'solid',
			width : 1,
			radius : 0
		},
		/**
		 * @cfg {Boolean} 此组件是否启用阴影效果。启用阴影在移动客户端上可能会引起渲染速度变慢。(默认为false)
		 */
		shadow : false,
		/**
		 * @cfg {String} 此组件阴影的颜色值.(默认为'#666666')
		 */
		shadow_color : '#666666',
		/**
		 * @cfg {Number} 此组件阴影的模糊程度,单位px。(默认为4)
		 */
		shadow_blur : 4,
		/**
		 * @cfg {Number} 此组件阴影的x轴偏移量,单位px。(默认为0)
		 */
		shadow_offsetx : 0,
		/**
		 * @cfg {Number} 此组件阴影的y轴偏移量,单位px。(默认为0)
		 */
		shadow_offsety : 0
	});

	/**
	 * the running variable cache
	 */
	this.variable = {};

	/**
	 * the container of all events
	 */
	this.events = {};
	this.preventEvent = false;
	this.initialization = false;
	
	
	/**
	 * register the common event
	 */
	this.registerEvent(
	/**
	 * @event 初始化完成之后触发。
	 * @paramter iChart.Painter#this
	 */
	'initialize');
	/**
	 * inititalize configure
	 */
	this.configure.apply(this, Array.prototype.slice.call(arguments, 1));

	/**
	 * megre customize config
	 */
	this.set(config);

	this.afterConfiguration();
}

iChart.Element.prototype = {
	set : function(c) {
		if (iChart.isObject(c))
			iChart.merge(this.options, c);
	},
	pushIf : function(name, value) {
		if (!this.get(name)) {
			return this.push(name, value);
		}
		return this.get(name);
	},
	/**
	 * average write speed about 0.013ms
	 */
	push : function(name, value) {
		var A = name.split("."), V = this.options;
		for (i = 0; i < A.length - 1; i++) {
			if (!V[A[i]])
				V[A[i]] = {};
			V = V[A[i]];
		}
		V[A[A.length - 1]] = value;
		return value;
	},
	/**
	 * average read speed about 0.005ms
	 */
	get : function(name) {
		var A = name.split("."), V = this.options[A[0]];
		for (i = 1; i < A.length; i++) {
			if (!V)
				return null;
			V = V[A[i]];
		}
		return V;
	}
}//@end
